<?php
class Back_Model_Utilisateurs extends Jnd_Model_Abstract
{
    protected $id = 0;
    protected $nom;
    protected $prenom;
    protected $mail;
    protected $dateNaissance = 0;
    protected $age;
    protected $adresse;
    protected $adresseComplement;
    protected $codePostal;
    protected $ville;
    protected $telephoneFixe;
    protected $telephonePortable;
    protected $pseudo;
    protected $motDePasse;
    protected $licence = "";
    protected $creationDate;
    protected $creationUtilisateur;
    protected $modificationUtilisateur;
    protected $modificationDate;
    protected $derniereConnexion;
    protected $tailleTshirt = "";
    protected $tailleShort = "";
    protected $contact1Nom = "";
    protected $contact1Tel = "";
    protected $contact1Port = "";
    protected $contact1Mail = "";
    protected $contact2Nom = "";
    protected $contact2Tel = "";
    protected $contact2Port = "";
    protected $contact2Mail = "";
    protected $autoriserPublication = 1;
    protected $_groupes = array();
    protected $_contoleUnicite = array(
        "mail",
        "nom", 
        "prenom", 
        "dateNaissance"
    );
    
    /**
     *
     * @var Back_Model_Groupes
     */
    protected $_groupe = null;

    /**
     *
     * @return Back_Model_Mapper_Utilisateurs
     * @see Jnd_Model_Abstract::_getMapper()
     */
    public function _getMapper()
    {
        return parent::_getMapper();
    }

    /**
     * Rempli le modèle en cours avec les données
     *
     * @param int $id            
     * @return bool
     */
    public function charger( $id )
    {
        $mapper = $this->_getMapper();
        $mapper->chercher($id, $this);
        
        $groupes = array();
        $tmp = $this->getGroupe()->chercherParUtilisateur($this->getId());
        foreach ($tmp as $groupeData) {
            $groupes[] = new Back_Model_Groupes($groupeData);
        }
        $this->_groupes = $groupes;
        return $this;
    }

    /**
     *
     * @see Jnd_Model_Abstract::getId()
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     *
     * @return Back_Model_Groupes
     */
    public function getGroupe()
    {
        if (is_null($this->_groupe)) {
            $this->_groupe = new Back_Model_Groupes();
        }
        return $this->_groupe;
    }

    /**
     *
     * @see Jnd_Model_Abstract::setId()
     */
    public function setId( $id )
    {
        $this->id = $id;
    }

    public function setAge( $age )
    {
        if ($age == null) {
            $dateNaissance = new Zend_Date($this->getDateNaissance(), Jnd_Global_Constantes::FORMAT_DATE_WEB_COURT);
            $age = date('Y') - $dateNaissance->get('Y');
        }
        $this->age = $age;
    }

    public function sauver()
    {
        $utilisateur = Jnd_App::getEnvironnement()->getUtilisateurCourant();
        if (is_null($utilisateur)) {
            $idUtilisateur = 1;
        } else {
            $idUtilisateur = $utilisateur->getId();
        }
        
        if ($this->getId() == 0) {
            // Création d'un utilisateur on hash le password
            $pwd = $this->getMotDePasse();
            $hashPwd = Jnd_Outils::generateHash($pwd);
            $this->setMotDePasse($hashPwd);
            
            $this->setCreationDate(date(Jnd_Global_Constantes::FORMAT_DATE_WEB_LONG));
            $this->setCreationUtilisateur($idUtilisateur);
        }
        $this->setModificationUtilisateur($idUtilisateur);
        $this->setModificationDate(date(Jnd_Global_Constantes::FORMAT_DATE_WEB_LONG));
        parent::sauver();
    }

    public static function recuperationSalt( $pseudo )
    {
        $mapper = new Back_Model_Mapper_Utilisateurs();
        return $mapper->recuperationSalt($pseudo);
    }

    public static function pseudoParId( $id )
    {
        $tmp = new self();
        $tmp->charger($id);
        return $tmp->getPseudo();
    }

    public function appartientAuGroupe( $groupe )
    {
        $flag = false;
        foreach ($this->_groupes as $grp) {
            if ($grp->getNom() == $groupe) {
                return true;
            }
        }
        return $flag;
    }

    /**
     *
     * @see Jnd_Model_Abstract::setOptions()
     */
    public function setOptions( array $options )
    {
        parent::setOptions($options);
        $tmp = $this->getGroupe()->chercherParUtilisateur($this->getId());
        $groupes = array();
        foreach ($tmp as $indice => $groupeData) {
            $groupes[] = new Back_Model_Groupes($groupeData);
        }
        $this->_groupes = $groupes;
    }

    /**
     * Fonction permettant de renvoyer le prénom et le nom d'un utilisateur dans
     * une variable de retour
     *
     * @return string
     */
    public function getPrenomNom()
    {
        return $this->getPrenom() . " " . $this->getNom();
    }

    /**
     * Fonction permettant de tester l'existance d'une couple Pseudo/Mail
     *
     * @param string $mail            
     * @param string $pseudo            
     * @return boolean
     */
    public static function controleCouplePseudoMail( $mail, $pseudo )
    {
        $mapper = new Back_Model_Mapper_Utilisateurs();
        $data = $mapper->controleCouplePseudoMail($mail, $pseudo);
        if ($data['pseudo'] == $pseudo && $data['mail'] == $mail) {
            return true;
        } else {
            return false;
        }
    }

    public static function chargerParCouplePseudoMail( $mail, $pseudo )
    {
        $mapper = new Back_Model_Mapper_Utilisateurs();
        $data = $mapper->chargerParCouplePseudoMail($mail, $pseudo);
        return new self($data["id"]);
    }

    public function controleExistance()
    {
        $controles = $this->_contoleUnicite;
        $valeurs = array();
        foreach ($controles as $controle) {
            $valeurs[$controle] = $this->$controle;
        }
        $result = $this->_getMapper()->controleExistance($valeurs);
        if ($result !== false) {
            $model = $this->charger($result['id']);
            $effacement = array_intersect_key($valeurs, $result);
            $this->setOptions($effacement);
            return true;
        }
        return $result;
    }

    public static function chercherParPseudo( $pseudo )
    {
        $retour = array();
        $mapper = new Back_Model_Mapper_Utilisateurs();
        $retour = $mapper->chargerParPseudo($pseudo);
        return new self($retour['id']);
    }

    public static function chercherPourAjax( $chaine = "" )
    {
        $mapper = new Back_Model_Mapper_Utilisateurs();
        $resultats = $mapper->chercherPourAjax($chaine);
        
        return $resultats;
    }
}
